package config

import (
	"fmt"
	"os"
	"strconv"

	"github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/joho/godotenv"
)

// 保持原有全局变量定义
var (
	Aliyun *AliyunConfig
	// 通用变量也可在这里定义（如果不想独立common.go）
	ServerPort     string
	MaxUploadSize  int64
	AllowFileTypes []string
)

type AliyunConfig struct {
	AccessKeyID     string
	AccessKeySecret string
	Region          string
	Endpoint        string
	Bucket          string
	STSRoleARN      string
	Timeout         int
	TIMEEXPIRES     int
	UserPrefix      string
	ThumbnailPrefix string
}

// 保持原有InitConfig入口-针对OSS服务
func InitConfig() error {

	if err := loadEnvFile(); err != nil { // 如果没独立common.go，需重复实现或引用
		return fmt.Errorf("加载环境变量失败: %w", err)
	}

	initBaseConfig() // 通用基础配置初始化

	return initOssServerConfig()
}

func initBaseConfig() {
	MaxUploadSize = getEnvInt64("MAX_UPLOAD_SIZE", 10*1024*1024)
	AllowFileTypes = []string{"image/jpeg", "image/png", "image/gif", "image/webp"}
}

func initOssServerConfig() error {
	Aliyun = &AliyunConfig{}
	Aliyun.Region = getEnv("OSS_REGION", "cn-wuhan-lr")
	Aliyun.Bucket = getEnv("OSS_BUCKET", "")
	Aliyun.STSRoleARN = getEnv("OSS_STS_ROLE_ARN", "")
	Aliyun.Timeout = getEnvInt("OSS_TIMEOUT", 30)
	Aliyun.TIMEEXPIRES = getEnvInt("OSS_TIME_EXPIRES", 3600)
	Aliyun.UserPrefix = getEnv("OSS_USER_PREFIX", "user/")
	Aliyun.ThumbnailPrefix = getEnv("OSS_THUMBNAIL_PREFIX", "thumbnail/")

	if Aliyun.Endpoint = getEnv("OSS_ENDPOINT", ""); Aliyun.Endpoint == "" {
		Aliyun.Endpoint = fmt.Sprintf("oss-%s.aliyuncs.com", Aliyun.Region)
	}

	Aliyun.AccessKeyID = getEnv("OSS_ACCESS_KEY", "")
	Aliyun.AccessKeySecret = getEnv("OSS_SECRET", "")

	if Aliyun.AccessKeyID == "" || Aliyun.AccessKeySecret == "" {
		return fmt.Errorf("缺少OSS_ACCESS_KEY或OSS_SECRET配置")
	}
	if Aliyun.Bucket == "" {
		return fmt.Errorf("缺少OSS_BUCKET配置")
	}

	ServerPort = getEnv("OSS_SERVER_PORT", "50051")
	return nil
}

// 获取OSS客户端
func NewOSSClient() (*oss.Client, error) {
	return oss.New(Aliyun.Endpoint, Aliyun.AccessKeyID, Aliyun.AccessKeySecret)
}

// 获取STS客户端
func NewSTSClient() (*sts.Client, error) {
	return sts.NewClientWithAccessKey(Aliyun.Region, Aliyun.AccessKeyID, Aliyun.AccessKeySecret)
}

// 环境变量获取工具函数
func getEnv(key, defaultValue string) string {
	if value, exists := os.LookupEnv(key); exists && value != "" {
		return value
	}
	return defaultValue
}

// 获取int值
func getEnvInt(key string, defaultValue int) int {
	valueStr := getEnv(key, "")
	if valueStr == "" {
		return defaultValue
	}
	value, err := strconv.Atoi(valueStr)
	if err != nil {
		fmt.Printf("警告：环境变量%s格式错误，使用默认值%d: %v\n", key, defaultValue, err)
		return defaultValue
	}
	return value
}

// 获取64位int
func getEnvInt64(key string, defaultValue int64) int64 {
	valueStr := getEnv(key, "")
	if valueStr == "" {
		return defaultValue
	}
	value, err := strconv.ParseInt(valueStr, 10, 64)
	if err != nil {
		fmt.Printf("警告：环境变量%s格式错误，使用默认值%d: %v\n", key, defaultValue, err)
		return defaultValue
	}
	return value
}

// 辅助函数：加载.env文件
func loadEnvFile() error {
	if err := godotenv.Load(".env"); err != nil {
		fmt.Printf("警告：未找到.env文件，将使用系统环境变量: %v\n", err)
		return nil // 非致命错误，继续执行
	}
	return nil
}
